#ifndef __HOT_M__
#define __HOT_M__
#include "data.hpp"
#include <unistd.h>

extern Cloud::DataManager *_data;

namespace Cloud
{
    class HotManager
    {
    public:
        HotManager()
        {
            Config *cfg = Config::GetInstance();
            _back_dir = cfg->GetBackDir();
            _pack_dir = cfg->GetPackDir();
            _pack_suffix = cfg->GetPackFileSuffix();
            _hot_time = cfg->GetHotTime();
            //如果目录不存在就创建（读取了路径，可能这个路径并不存在(第一次启动)，所以我们需要创建一下）
            FileUtil dir1(_back_dir);
            FileUtil dir2(_pack_dir);
            dir1.CreateDirectory();
            dir2.CreateDirectory();
        }
        bool RunModule()
        {
            while(1)
            {
                //1.编列备份目录，获取所有文件名
                FileUtil file(_back_dir);
                std::vector<std::string> array;
                file.ScanDirectory(&array);//浏览目录
                //2.判断是否是热点文件
                for(auto &a : array)
                {
                    if(HotJudge(a) == false)
                    {
                        //热点文件
                        continue;
                    }
                    //不是热点文件3.0进行获取文件的备份信息
                    BackUpInfo bi;
                    if(_data->GetOneByRealPath(a, &bi) == false)
                    {
                        //现在有一个文件，但是没有备份信息
                        bi.NewBackUpInfo(a);//设置新的备份文件
                    }
                    //3.1压缩文件到压缩包路径下
                    FileUtil tmp(a);
                    tmp.Compress(bi.pack_path);
                    //4.删除源文件，修改文件信息(压缩包标志)
                    tmp.Remove();
                    bi.pack_flag = true;
                    _data->UpData(bi);//更新备份信息
                }
                usleep(1000);//避免循环空目录，消耗资源过多
            }
            return true;
        }
    private:
        bool HotJudge(const std::string &filename)//判断是否时热点文件
        {
            FileUtil file(filename);
            //获取文件的最新访问时间和现在的时间的差值进行比较
            time_t acc_time = file.LastAccTime();
            time_t cur_time = time(NULL);//获取当前时间
            if(cur_time - acc_time > _hot_time)
            {
                return true;
            }
            return false;
        }
    private:
    //从内置文件中获取
        std::string _back_dir;//备份目录
        std::string _pack_dir;//压缩包目录
        std::string _pack_suffix;//压缩包后缀
        int _hot_time;//热点时间
    };
}

#endif